package main

import (
	"fmt"
	"log"
	"os"
)

/*
    Writer接口的定义，Write()方法用于写出数据
    type Writer interface {
        Write(p []byte) (n int, err error)
    }

    Seeker接口的定义，封装了基本的 Seek 方法。
    type Seeker interface {
        Seek(offset int64, whence int) (int64, error)
    }
    Seeker 用来移动数据的读写指针
		Seek 设置下一次读写操作的指针位置，每次的读写操作都是从指针位置开始的
		whence 的含义：
    		如果 whence 为 0：表示从数据的开头开始移动指针
    		如果 whence 为 1：表示从数据的当前指针位置开始移动指针
    		如果 whence 为 2：表示从数据的尾部开始移动指针
		offset 是指针移动的偏移量
    		返回移动后的指针位置和移动过程中遇到的任何错误

     WriterTo接口的定义，封装了基本的 WriteTo 方法。
     type WriterTo interface {
        WriteTo(w Writer) (n int64, err error)
     }
     WriterTo 将对象的数据流写入到 w 中
    	直到对象的数据流全部写入完毕或遇到写入错误为止
    	返回值 n 是写入的字节数
    	返回值 err 就是 w 的返回值 err

    定义WriterAt接口，WriterAt 接口封装了基本的 WriteAt 方法
    type WriterAt interface {
        WriteAt(p []byte, off int64) (n int, err error)
    }
    WriteAt 将 p 中的数据写入到对象数据流的 off 处
    	忽略数据的读写指针，从数据的起始位置偏移 off 处开始写入
    	返回写入的字节数和写入时遇到的错误
    	如果 n < len(p)，则必须返回一个 err 值来说明
    	为什么没有将 p 完全写入
*/
func main() {

	fileName :="/Users/chukun/work/other/a.txt"
	//step1：打开文件
	//step2：写出数据
	//step3：关闭文件
	file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, os.ModePerm)
	if err != nil{
		fmt.Println(err)
		return
	}
	defer file.Close()

	bs :=[] byte {97,98,99,100}

	write, err := file.Write(bs)
	fmt.Println(write)
	HandleErr(err)
	_, _ = file.WriteString("\n")

	//直接写出字符串
	write,err = file.WriteString("HelloWorld")
	fmt.Println(write)
	HandleErr(err)

	file.WriteString("\n")
	write,err =file.Write([]byte("today"))
	fmt.Println(write)
	HandleErr(err)
}

func HandleErr(err error){
	if err != nil{
		log.Fatal(err)
	}
}
